package personal.wang.job;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.SerializationUtils;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.serialization.StringSerializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import personal.wang.dic.DicInitializer;
import personal.wang.constant.AppConstant;
import personal.wang.fileAccess.FileAccess;
import personal.wang.producer.DataMockProducer;
import personal.wang.producer.ProducerHandler;
import personal.wang.summary.RecordSummary;
import personal.wang.template.TemplateAnalyzer;

import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

/**
 * @className: TestPoint
 * @Description:
 * @Author: wangyifei
 * @Date: 2022/6/16 16:55
 */
public class TestPoint  {
//public class TestPoint extends RecordSummary implements Runnable , Serializable {
//    private static Logger logger = LoggerFactory.getLogger(TestPoint.class);
//    // 分割多个语句的标识符
//    private static String SEPERATOR = ";;;" ;
//    // 保存统计指标的路径
//    private String summaryPath ;
//    // 生产者类型，有两种一种是幂等，一种是事务
//    private String producerType ;
//    // 测试点的名称
//    private String name;
//    // 生产者数量
//    private Integer producerNumber ;
//    // job 配置文件的路径
//    private String path ;
//    // 一共要发送了多少条数据，-1 代表是无数次
//    private int msgNumber ;
//    // 批量发送的数据条数
//    private int batchSize ;
//    // kafka bootstrap 地址
//    private String kafkaBootstrap ;
//    // 目标 topic 的名称
//    private String[] topicNames ;
//    // 字段的初始化类
//    private DicInitializer dicInitializer = new DicInitializer();
//    // 测试数据备份的路径
//    private String backupPath ;
//    private String tableName ;
//    private String dicPath ;
//    private String tplPath;
//
//    public String getDicPath() {
//        return dicPath;
//    }
//
//    public void setDicPath(String dicPath) {
//        this.dicPath = dicPath;
//    }
//
//    public String getTplPath() {
//        return tplPath;
//    }
//
//    public void setTplPath(String tplPath) {
//        this.tplPath = tplPath;
//    }
//
//    public static Logger getLogger() {
//        return logger;
//    }
//
//    public static void setLogger(Logger logger) {
//        TestPoint.logger = logger;
//    }
//
//    public static String getSEPERATOR() {
//        return SEPERATOR;
//    }
//
//    public static void setSEPERATOR(String SEPERATOR) {
//        TestPoint.SEPERATOR = SEPERATOR;
//    }
//
//    public String getSummaryPath() {
//        return summaryPath;
//    }
//
//    public void setSummaryPath(String summaryPath) {
//        this.summaryPath = summaryPath;
//    }
//
//    public String getProducerType() {
//        return producerType;
//    }
//
//    public void setProducerType(String producerType) {
//        this.producerType = producerType;
//    }
//
//    public String getName() {
//        return name;
//    }
//
//    public void setName(String name) {
//        this.name = name;
//    }
//
//    public Integer getProducerNumber() {
//        return producerNumber;
//    }
//
//    public void setProducerNumber(Integer producerNumber) {
//        this.producerNumber = producerNumber;
//    }
//
//    public String getPath() {
//        return path;
//    }
//
//    public void setPath(String path) {
//        this.path = path;
//    }
//
//    public int getMsgNumber() {
//        return msgNumber;
//    }
//
//    public void setMsgNumber(int msgNumber) {
//        this.msgNumber = msgNumber;
//    }
//
//    public int getBatchSize() {
//        return batchSize;
//    }
//
//    public void setBatchSize(int batchSize) {
//        this.batchSize = batchSize;
//    }
//
//    public String getKafkaBootstrap() {
//        return kafkaBootstrap;
//    }
//
//    public void setKafkaBootstrap(String kafkaBootstrap) {
//        this.kafkaBootstrap = kafkaBootstrap;
//    }
//
//    public String[] getTopicNames() {
//        return topicNames;
//    }
//
//    public void setTopicNames(String[] topicNames) {
//        this.topicNames = topicNames;
//    }
//
//    public String getBackupPath() {
//        return backupPath;
//    }
//
//    public void setBackupPath(String backupPath) {
//        this.backupPath = backupPath;
//    }
//
//    public String getTableName() {
//        return tableName;
//    }
//
//    public void setTableName(String tableName) {
//        this.tableName = tableName;
//    }
//    public Properties getProducerProperties(){
//       Properties prop = new Properties();
//       prop.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG , kafkaBootstrap);
//       prop.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG , "true");
//       prop.put(ProducerConfig.LINGER_MS_CONFIG , 10);
//       prop.put(ProducerConfig.COMPRESSION_TYPE_CONFIG , "lz4");
//       prop.put(ProducerConfig.ACKS_CONFIG , 1);
//       prop.put(ProducerConfig.RETRIES_CONFIG , 3);
//       // 32 M
//       prop.put(ProducerConfig.BUFFER_MEMORY_CONFIG , 33554432);
//       // 16 k
//       prop.put(ProducerConfig.BATCH_SIZE_CONFIG , 16384);
//
//       prop.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG , StringSerializer.class.getCanonicalName());
//       prop.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getCanonicalName());
//
//       return prop ;
//    }
//
//    public void execute() {
//        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
//                producerNumber,
//                producerNumber,
//                0L,
//                TimeUnit.MILLISECONDS,
//                new LinkedBlockingDeque<>(),
//                new BasicThreadFactory.Builder()
//                        .namingPattern(name.replace("/", ""))
//                        .build()
//        );
//        List<TestPoint> clones = new ArrayList<>();
//        TestPoint testPoint = null ;
//        for (int i = 0; i < producerNumber; i++) {
//            testPoint = SerializationUtils.clone(this);
//            clones.add(testPoint);
//            threadPoolExecutor.execute(testPoint);
//        }
//        threadPoolExecutor.shutdown();
//
//        try{
//            threadPoolExecutor.awaitTermination(1000 , TimeUnit.SECONDS);
//            Long succSum = clones.stream().map(x -> Objects.isNull(x)? 0L:x.getSuccSum()).collect(Collectors.summingLong(x -> Objects.isNull(x)?0L:x));
//            Long failSum = clones.stream().map(x -> Objects.isNull(x)? 0L:x.getFailSum()).collect(Collectors.summingLong(x -> Objects.isNull(x)?0L:x));
//            this.setSuccSum(succSum);
//            this.setFailSum(failSum);
//            logger.info("{}" ,getSummary(this.name , this.backupPath));
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
//    }
//
//    @Override
//    public String toString() {
//        return "TestPoint{" +
//                "summaryPath='" + summaryPath + '\'' +
//                ", producerType='" + producerType + '\'' +
//                ", name='" + name + '\'' +
//                ", producerNumber=" + producerNumber +
//                ", path='" + path + '\'' +
//                ", msgNumber=" + msgNumber +
//                ", batchSize=" + batchSize +
//                ", kafkaBootstrap='" + kafkaBootstrap + '\'' +
//                ", topicNames=" + Arrays.toString(topicNames) +
//                ", dicInitializer=" + dicInitializer +
//                ", backupPath='" + backupPath + '\'' +
//                ", tableName='" + tableName + '\'' +
//                ", dicPath='" + dicPath + '\'' +
//                ", tplPaht='" + tplPath + '\'' +
//                '}';
//    }
//
//    @Override
//    public void run() {
//        // 初始化字典
//        DicInitializer.loadDics(this.getDicPath());
//        // 加载输出模板内容
//        TemplateAnalyzer templateAnalyzer = new TemplateAnalyzer("" ,loadTemplate());
//        String analyse = templateAnalyzer.analyse();
//
//        // 备份发送记录
//        FileAccess fa = new FileAccess();
//        String backup = backupPath
//                + File.separator
//                + Thread.currentThread().getName().replaceAll("/" , "")
//                + AppConstant.UNDERLINE
//                + Thread.currentThread().getId()
//                + new SimpleDateFormat("yyyyMMddhhmmss").format(new Date())
//                + ".txt";
//        // producer 准备
//        DataMockProducer producer = null ;
//        ProducerHandler father = new ProducerHandler();
//        if("tx".equals(producerType)){
//            producer = new ProducerHandler.TransactionProducer();
//            producer.init(kafkaBootstrap , UUID.randomUUID().toString());
//        }else{
//            producer = new ProducerHandler.IdempotenceProducer();
//            producer.init(kafkaBootstrap , null);
//        }
//        ((ProducerHandler)producer).setTestPoint(this);
//        String cnt = null ;
//        StringBuilder sb = new StringBuilder();
//        int maxVal = (msgNumber==-1?10:msgNumber);
//        List<String> batch = new ArrayList<>(100);
//        int j = 0;
//        try{
//            for (int i = 0; i < maxVal; ) {
//                cnt = templateAnalyzer.analyse();
//                cnt = cnt.replaceAll("\\s{2,}" , "");
//                batch.addAll(Arrays.stream(cnt.split(";;;")).collect(Collectors.toList()));
//                if(i > 0 && i%batchSize == 0){
//                    producer.send(batch , sb , topicNames[(j++)% topicNames.length]);
//                    fa.fileWrite(backup , sb.toString() , true);
//                    batch.clear();
//                    sb.setLength(0);
//                }
//                if(maxVal != -1){
//                    i++;
//                }
//            }
//            if(!batch.isEmpty()){
//                producer.send(batch , sb , topicNames[(j++)% topicNames.length]);
//                fa.fileWrite(backup , sb.toString() , true);
//                batch.clear();
//            }
//        }catch (Exception e){
//            logger.info("{}" , e);
//        }finally {
//            producer.close();
//        }
//    }
//    private String loadTemplate(){
//        String rs = null ;
//        File file = new File(tplPath);
//        try{
//            if(file.exists() && file.isDirectory()){
//                for (File listFile : file.listFiles()) {
//                    if(listFile.getName().endsWith(".tpl")){
//                        rs = FileUtils.readFileToString(listFile);
//                    }
//                }
//            }
//        }catch (IOException e){
//            e.printStackTrace();
//        }
//        return rs ;
//    }
//
//    @Override
//    public void record(boolean succ, int d) {
//        if(succ){
//            if(Objects.isNull(succSum)){
//                succSum = 0L ;
//            }
//            succSum += (long)d;
//        }else {
//            if(Objects.isNull(failSum)){
//                failSum = 0L ;
//            }
//            failSum += (long)d;
//        }
//    }
}
